/*
  用户登录，服务器验证用户名密码是否正确，查询用户数据
    对用户数据进行 json web token 加密, 得到 token
    将token以响应体方式响应给浏览器

  下次浏览器发送请求，携带token，服务器以 json web token 解密token。
  得到加密前用户数据，从而识别是哪个用户
*/

const express = require("express");

const app = express();
const jwt = require("jsonwebtoken");

const secret = "19d28%q_M54Bp0";

const sign = (data) => {
  return new Promise((resolve, reject) => {
    jwt.sign(data, secret, { expiresIn: 10 }, function (err, token) {
      if (err) reject(err);
      else resolve(token);
    });
  });
};

const verify = (token) => {
  return new Promise((resolve, reject) => {
    jwt.verify(token, secret, function (err, data) {
      if (err) reject(err);
      else resolve(data);
    });
  });
};

app.get("/login", async (req, res) => {
  const user = { name: "jack", age: 18 };
  const token = await sign(user);
  res.json({
    code: 200,
    data: token,
  });
});

app.get("/user", async (req, res) => {
  try {
    const token = req.headers.token;
    const user = await verify(token);
    res.json({
      code: 200,
      data: user,
    });
  } catch {
    res.status(407).json({
      code: 201,
      message: "token过期或无效",
    });
  }
});

app.listen(3000, "localhost", (err) => {
  if (err) console.log(err);
  else console.log("服务器启动成功");
});
